package com.acegear.horizon;

import com.acegear.horizon.domain.models.Post;
import com.acegear.horizon.domain.repository.ClubEventRepository;
import com.acegear.horizon.domain.repository.ClubRepository;
import com.acegear.horizon.domain.repository.CommentRepository;
import com.acegear.horizon.domain.repository.DailyRepository;
import com.acegear.horizon.domain.repository.PostRepository;
import com.acegear.horizon.domain.repository.UserRepository;
import com.acegear.horizon.domain.repository.jpa.UserAuthRepository;
import com.acegear.horizon.domain.services.KongService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.Arrays;
import java.util.List;

import javax.annotation.PostConstruct;

/**
 * Created by mercury on 2016/12/25.
 */
@Component
public class InitBean {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private ClubRepository clubRepository;

    @Autowired
    private DailyRepository dailyRepository;

    @Autowired
    private PostRepository postRepository;

    @Autowired
    private ClubEventRepository eventRepository;

    @Autowired
    private UserAuthRepository userAuthRepository;

    @Autowired
    private KongService kongService;

    private Long postId1;

    private Long postId2;

//    @PostConstruct
//    public void initUser() {
//        User.manageUserRegister(new UserInfo(4L, "黑瞳", "https://img.acegear.com/2016/11/25/c83b913e-c50b-4a66-9087-e903cf560925/w700", 1, "北京", "iAcro 核心成员")).save();
//
//        User.manageUserRegister(new UserInfo(5L,
//                "电子土豆",
//                "https://img.acegear.com/2016/11/25/72f53a33-8b23-428f-92c1-4cce63edd3ee/w700",
//                1, "北京")).save();
//
//        User.manageUserRegister(new UserInfo(6L, "烙饼",
//                "https://img.acegear.com/2016/11/25/d9da788f-56b2-4bda-8952-43b47a325567/w700",
//                1, "北京", "UTA 创始人")).save();
//
//        User.manageUserRegister(new UserInfo(7L, "何旭东",
//                "https://img.acegear.com/2016/11/25/3b41ba58-f079-45ad-881e-c516b7f98ef0/w700",
//                1, "北京", "著名拉力选手")).save();
//        User.manageUserRegister(new UserInfo(8L, "A8",
//                "https://img.acegear.com/2016/11/25/0635e0c2-7500-4c01-89dd-4b03121dfc9b/w700",
//                1, "北京", "沙漠总队总队长")).save();
//    }
//
//    @PostConstruct
//    public void initClub() {
//        iacro();
//        fw();
//        ds();
//    }
//
//    private void iacro() {
//        ClubBase clubBase = new ClubBase(1L, "iAcro", "https://img.acegear.com/2016/11/25/9d407c52-0008-4c84-9b16-ff42f05afa27/w700",
//                "https://img.acegear.com/2016/11/25/9d407c52-0008-4c84-9b16-ff42f05afa27/w700");
//
//        List<ContentPart> contentParts = new ArrayList<>();
//        contentParts.add(new ContentPart(ContentType.TEXT, "iacro·iacrophobia·恐高症 | cars·culture·fashion·lifestyle", 1));
//        ClubInfo clubInfo = new ClubInfo(1L, "iacro·iacrophobia·恐高症 | cars·culture·fashion·lifestyle",
//                new ContactInfo("", "", ""),
//                new Address("", "", "", "", ""),
//                contentParts);
//
//        new Club(clubBase, clubInfo).save();
//    }
//
//    private void fw() {
//        ClubBase clubBase = new ClubBase(2L, "Fast4Ward",
//                "https://img.acegear.com/2016/11/25/707b3271-dfae-48cd-b591-3727455b8a6e/w700",
//                "https://img.acegear.com/2016/11/25/707b3271-dfae-48cd-b591-3727455b8a6e/w700");
//        List<ContentPart> contentParts = new ArrayList<>();
//        contentParts.add(new ContentPart(ContentType.TEXT, "唯一的专业直线竞速赛专业，正规有组织的封闭场地内合理合法的驾车竞速", 1));
//        ClubInfo clubInfo = new ClubInfo(2L, "唯一的专业直线竞速赛专业，正规有组织的封闭场地内合理合法的驾车竞速",
//                new ContactInfo("", "", ""),
//                new Address("", "", "", "", ""),
//                contentParts);
//        new Club(clubBase, clubInfo).save();
//    }
//
//    private void ds() {
//        ClubBase clubBase = new ClubBase(3L, "沙漠总队",
//                "https://img.acegear.com/2016/11/25/ffb4e823-a67d-4042-954a-366436faab22/w700",
//                "https://img.acegear.com/2016/11/25/ffb4e823-a67d-4042-954a-366436faab22/w700");
//        List<ContentPart> contentParts = new ArrayList<>();
//        contentParts.add(new ContentPart(ContentType.TEXT, "潇洒前行，乘风破浪", 1));
//        ClubInfo clubInfo = new ClubInfo(3L, "潇洒前行，乘风破浪",
//                new ContactInfo("", "", ""),
//                new Address("", "", "", "", ""),
//                contentParts);
//        new Club(clubBase, clubInfo).save();
//    }
//
//    @PostConstruct
//    public void initClubMember() {
//        userRepository.findByUserId(4L).map(user -> {
//            user.joinClub(1L);
//            user.joinClub(2L);
//            return user.joinClub(3L);
//        });
//        userRepository.findByUserId(5L).map(user -> {
//            user.joinClub(3L);
//            user.joinClub(2L);
//            return user.joinClub(1L);
//        });
//    }
//
//    @PostConstruct
//    public void initPost() {
//        longPost();
//        shortPost();
//    }
//
//    private void longPost() {
//        List<ContentPart> contentParts = new ArrayList<>();
//        contentParts.add(new ContentPart(ContentType.TITLE, "长文标题1111", 1));
//        contentParts.add(new ContentPart(ContentType.COVER, "https://img.acegear.com/2016/11/25/9d407c52-0008-4c84-9b16-ff42f05afa27/w700", 2));
//        contentParts.add(new ContentPart(ContentType.SUMMARY, "长文内容1111", 3));
//        contentParts.add(new ContentPart(ContentType.IMAGE, "https://img.acegear.com/2016/11/25/ffb4e823-a67d-4042-954a-366436faab22/w700", 4));
//        contentParts.add(new ContentPart(ContentType.TEXT, "长文内容2222", 5));
//
//        System.out.print(userRepository.findByUserId(4L));
//        postId1 = userRepository.findByUserId(4L).map(user -> user.postTo(1L, 1, contentParts)).get().getFeedId();
//    }
//
//    private void shortPost() {
//        List<ContentPart> contentParts = new ArrayList<>();
//        contentParts.add(new ContentPart(ContentType.TEXT, "短文内容", 1));
//        contentParts.add(new ContentPart(ContentType.IMAGE, "https://img.acegear.com/2016/11/25/ffb4e823-a67d-4042-954a-366436faab22/w700", 2));
//
//        postId2 = userRepository.findByUserId(4L).map(user -> user.postTo(1L, 2, contentParts)).get().getFeedId();
//    }
//
//    @PostConstruct
//    public void initDaily() {
//        Post post1 = postRepository.findByPostId(postId1).get();
//        Post post2 = postRepository.findByPostId(postId2).get();
//
//        AGDailyFeed agDailyPost1 = new AGDailyFeed(post1.getUserPost(), 1);
//        AGDailyFeed agDailyPost2 = new AGDailyFeed(post2.getUserPost(), 2);
//
//        List<AGDailyFeed> posts = new ArrayList<>();
//
//        posts.add(agDailyPost1);
//        posts.add(agDailyPost2);
//
//        AGDaily agDaily = new AGDaily(1L,
//                new Timestamp(System.currentTimeMillis()),
//                System.currentTimeMillis(), true,
//                "https://img.acegear.com/2017/0/3/0f8ebf28-30a7-41a9-92a2-c11e3816a842/w700",
//                posts);
//        Daily daily = new Daily(agDaily);
//
//        daily.save();
//    }
//
//    @PostConstruct
//    public void initDaily1() {
//        AGDailyFeed agDailyPost1 = new AGDailyFeed(initPost1(), 1);
//        AGDailyFeed agDailyPost2 = new AGDailyFeed(initPost2(), 2);
//        AGDailyFeed agDailyPost3 = new AGDailyFeed(initPost3(), 3);
//
//        List<AGDailyFeed> posts = new ArrayList<>();
//
//        posts.add(agDailyPost1);
//        posts.add(agDailyPost2);
//        posts.add(agDailyPost3);
//        AGDaily agDaily = new AGDaily(2L,
//                new Timestamp(System.currentTimeMillis()),
//                System.currentTimeMillis(), true,
//                "https://img.acegear.com/2017/0/3/0f8ebf28-30a7-41a9-92a2-c11e3816a842/w700",
//                posts);
//        Daily daily = new Daily(agDaily);
//
//        daily.save();
//    }
//
//    public UserPost initPost1() {
//        List<ContentPart> contentParts = new ArrayList<>();
//        contentParts.add(new ContentPart(ContentType.TITLE, "2017沃德十佳发动机公布", 1));
//        contentParts.add(new ContentPart(ContentType.COVER, "https://img.acegear.com/2016/11/21/90a76962-3f2b-4fe2-894d-37aaf507fa12/w700", 2));
//        contentParts.add(new ContentPart(ContentType.SUMMARY, "2017年10佳发动机包括涡轮增压发动机和混合动力系统，并无自然吸气发动机入选，同时28年来首次没有V8发动机入选。沃德大佬Drew Winter称，今年的10佳榜单反映出汽车厂商采用降低排量、涡轮增压和电动化等技术手段在动力输出和油耗之间求得平衡的明显趋势。", 3));
//        contentParts.add(new ContentPart(ContentType.TEXT, "沃德10佳发动机由沃德编辑在车价不高于62,000美元的40款车中选出，评判的标准包括发动机的功率、扭矩、噪音和油耗等。", 4));
//        contentParts.add(new ContentPart(ContentType.IMAGE, "https://img.acegear.com/2016/11/20/a70a4148-405d-42d2-8454-780a93131e77/w700", 5));
//        return userRepository.findByUserId(4L).map(user -> user.postTo(1L, 1, contentParts)).get().getUserPost();
//    }
//
//    public UserPost initPost2() {
//        List<ContentPart> contentParts = new ArrayList<>();
//        contentParts.add(new ContentPart(ContentType.TITLE, "热烈祝贺沙纵精英分队四大无人区穿越成功，特别是山子释然先和沙纵大队穿越了四大沙漠，又单独穿越哈拉湖", 1));
//        contentParts.add(new ContentPart(ContentType.COVER, "https://img.acegear.com/2016/11/20/a70a4148-405d-42d2-8454-780a93131e77/w700", 2));
//        contentParts.add(new ContentPart(ContentType.SUMMARY, "罗布泊，继续会合北京出发的穿越三无车队，完成了四沙四无的大穿越，沙纵牛人啊", 3));
//        return userRepository.findByUserId(4L).map(user -> user.postTo(1L, 1, contentParts)).get().getUserPost();
//    }
//
//    public UserPost initPost3() {
//        List<ContentPart> contentParts = new ArrayList<>();
//        contentParts.add(new ContentPart(ContentType.TITLE, "2016年量产摩托车动力输出榜前十名", 1));
//        contentParts.add(new ContentPart(ContentType.COVER, "https://img.acegear.com/2016/11/30/c8086ad4-ea8d-449e-ae6f-0a26ee31f9ec/w700", 2));
//        contentParts.add(new ContentPart(ContentType.SUMMARY, "第十名：雅马哈YZF-R1，官方最大动力输出200马力", 3));
//        contentParts.add(new ContentPart(ContentType.IMAGE, "https://img.acegear.com/2016/11/28/11348e80-ef33-4d4c-ae15-862d57b4cbe6/w700", 4));
//        contentParts.add(new ContentPart(ContentType.TEXT, "第九名：川崎ZX-10R，官方最大动力输出200马力", 5));
//        contentParts.add(new ContentPart(ContentType.IMAGE, "https://img.acegear.com/2016/11/28/c3baeaae-eef3-4a4a-9af7-fc9e837f3462/w700", 6));
//        return userRepository.findByUserId(4L).map(user -> user.postTo(1L, 1, contentParts)).get().getUserPost();
//    }
//
//    @PostConstruct
//    public void initEvent() {
//        Calendar calendar = new GregorianCalendar();
//        calendar.add(Calendar.MONTH, 1);
//        Long startAt = calendar.getTimeInMillis();
//        calendar.add(Calendar.DATE, 1);
//        Long endAt = calendar.getTimeInMillis();
//        List<Long> sponsors = new ArrayList<>();
//        sponsors.add(2L);
//        sponsors.add(3L);
//        ClubEventBase eventBase = new ClubEventBase(1L,
//                1L,
//                sponsors,
//                "2016iAcro&F4W\n" +
//                        "动静结合大聚珠海站",
//                startAt,
//                endAt,
//                "iAcro主理人裤裆老爷。\n" +
//                        "对改装车感兴趣的人应该都知道他。\n" +
//                        "对改装车文化推动作用巨大。\n" +
//                        "此次大型车聚地点选在珠海·珠海机场，场地无比巨大，各路车友齐聚一堂。",
//                "https://img.acegear.com/2016/10/14/eca85c71-1924-4622-86f6-2fa77e6ebd4e/w700",
//                new Address("中国", "北京", "北京", "朝阳", "798"),
//                new Location(45d, 45d)
//        );
//        List<ContentPart> introduction = new ArrayList<>();
//        introduction.add(new ContentPart(ContentType.TEXT, "Acro是一种态度 是一种精神 更是一种永不放弃的信念 加入我们 把爱变得具体 让改装成为严肃的学问 \n" +
//                "北京，简称“京”，中华人民共和国首都、直辖市、国家中心城市、超大城市，全国政治中心、文化中心、国际交往中心、科技创新中心，是中国共产党中央委员会、中华人民共和国中央人民政府和全国人民代表大会的办公所在地，中国中部战区司令部驻地。\n" +
//                "北京位于华北平原北部，背靠燕山，毗邻天津市和河北省。北京的气候为典型的北温带半湿润大陆性季风气候。", 1));
//        ClubEventInfo eventInfo = new ClubEventInfo(1L, introduction);
//        ClubEvent event = new ClubEvent(eventBase);
//        event.setEventInfo(eventInfo);
//        event.save();
//    }
//
//    @PostConstruct
//    public void initEventItems() {
//        ClubEventItem item1 = new ClubEventItem(1L, "A 组活动票/次", 19900L, 1, 100);
//        ClubEventItem item2 = new ClubEventItem(2L, "A 组活动，场外应援", 5000L, 0, 2000);
//        List<ClubEventItem> items1 = new ArrayList<>();
//        items1.add(item1);
//        items1.add(item2);
//        ClubEventItemGroup group1 = new ClubEventItemGroup(1L, 1L, "以下选项为单选", ItemGroupType.RADIO, items1);
//        List<ClubEventItemGroup> groups1 = new ArrayList<>();
//        groups1.add(group1);
//        ClubEventStage stage1 = new ClubEventStage(1L, 1L, "第一阶段接力赛", groups1);
//
//        ClubEventItem item3 = new ClubEventItem(3L, "B 组活动票/次", 19900L, 1, 100);
//        ClubEventItem item4 = new ClubEventItem(4L, "B 组库房/小时", 9900L, 0, 100);
//        List<ClubEventItem> items2 = new ArrayList<>();
//        items2.add(item3);
//        items2.add(item4);
//        ClubEventItemGroup group2 = new ClubEventItemGroup(2L, 2L, "以下选项为复选", ItemGroupType.CHECK, items2);
//
//        ClubEventItem item5 = new ClubEventItem(5L, "B 组应援", 5000L, 5, 1000);
//        ClubEventItem item6 = new ClubEventItem(6L, "B 组投票", 0L, 1, 99999);
//        List<ClubEventItem> items3 = new ArrayList<>();
//        items3.add(item5);
//        items3.add(item6);
//
//        ClubEventItemGroup group3 = new ClubEventItemGroup(3L, 2L, "以下选项为复选", ItemGroupType.CHECK, items3);
//        List<ClubEventItemGroup> groups2 = new ArrayList<>();
//        groups2.add(group2);
//        groups2.add(group3);
//        ClubEventStage stage2 = new ClubEventStage(2L, 1L, "第二阶段", groups2);
//
//        List<ClubEventStage> stages = new ArrayList<>();
//        stages.add(stage1);
//        stages.add(stage2);
//        ClubEvent event = eventRepository.findByEventId(1L).get();
//        event.setEventStages(stages);
//        event.save();
//    }
//
//    @PostConstruct
//    public void initQA() {
//        ClubEventQA qa1 = new ClubEventQA(1L, 4L, "改装车型有限制吗？", "没有");
//        ClubEventQA qa2 = new ClubEventQA(1L, 4L, "活动当天的汽车最晚几点入场？是否限制认识的进入？门票是按照车辆吧？来迟了，是不是没有位置？", "问题回答：在活动结束前都可以，个人没有门票，只有车入场的时候需要购买门票，位置是有的，场地安排有序。在活动结束前都可以，个人没有门票，只有车入场的时候需要购买门票.");
//        List<ClubEventQA> qas = new ArrayList<>();
//        qas.add(qa1);
//        qas.add(qa2);
//        ClubEvent event = eventRepository.findByEventId(1L).get();
//        event.setQA(qas);
//        event.save();
//    }

    @Value("${transform}")
    private boolean transform;
    @Autowired
    private CommentRepository commentRepository;

    @PostConstruct()
    @Transactional
    public void transPosts() {
        if (transform) {
            postRepository.query(1023L).parallel().forEach(Post::save);
        }
    }

//    @PostConstruct
//    @Transactional
//    public void transComment() {
//        if (transform) {
//            commentRepository.query().parallel().forEach(Comment::save);
//        }
//    }

    @PostConstruct
    public void initKongUser() {
        if (transform) {
            userAuthRepository.findAll().forEach(userAuth -> {
                if (!kongService.userExist(userAuth)) {
                    kongService.kongUser(userAuth);
                } else {
                    kongService.kongDeleteJwt(userAuth);
                }
                kongService.kongJwt(userAuth);
            });
        }
    }

    @PostConstruct
    public void initKongApi() {
        List<String> apis = Arrays.asList("auth", "clubs", "users", "daily", "posts", "comments", "events", "auth/logout");
        apis.forEach(apiName -> {
            if (kongService.apiExist(apiName)) {
                kongService.deleteApi(apiName);
            }
            kongService.addApi(apiName);
            kongService.addCors(apiName);
            if (apiName.equals("auth")) return;
            kongService.addApiJwt(apiName);
        });
    }

}
